package utils

import (
	"gorm.io/gorm"
	"math"
)

// 分页结构体
type Pagination[T any] struct {
	Page       int   // 当前页码
	PageSize   int   // 每页大小
	TotalCount int64 // 总记录数
	TotalPages int   // 总页数
	Data       []T   //返回数据列表
}

// 计算总页数
func (p *Pagination[T]) setTotalPages() {
	if p.PageSize == 0 {
		p.TotalPages = 0
	} else {
		p.TotalPages = int(math.Ceil(float64(p.TotalCount) / float64(p.PageSize)))
	}
}

// 计算偏移量
func (p *Pagination[T]) offset() int {
	if p.Page <= 0 {
		p.Page = 1
	}
	if p.PageSize <= 0 {
		p.PageSize = 10
	}
	return (p.Page - 1) * p.PageSize
}

// 创建分页实例
func NewPagination[T any](page int, pageSize int, dataModel *gorm.DB) (*Pagination[T], error) {
	result := &Pagination[T]{
		Page:     page,
		PageSize: pageSize,
	}
	// 获取总记录数
	if err := dataModel.Count(&result.TotalCount).Error; err != nil {
		return result, err
	}
	result.setTotalPages()
	dataModel.Offset(result.offset()).Limit(result.PageSize).Find(&result.Data)
	return result, nil
}
